package Logica.PowerUps;

import General.Constantes;
import Graficas.InterfaceGrafica;
import Graficas.Sprite;
import Graficas.SpriteMovements;
import Graficas.SpriteMovementsPrioridad;
import Logica.Mario;
import Logica.Objeto;
import Logica.Puntuacion;
import Logica.Celdas.Celda;
import Logica.Enemigos.Enemigo;


/**
 * Clase que representa un PowerUp.
 * 
 * @author Mariano Rodecker
 * @author Matias Varela
 * 
 */
public abstract class PowerUp extends Objeto {
	protected Mario mario;

	/* COMANDOS */

	public void aplicarMario(Mario mario) {
		this.mario = mario;
		aumentarPuntos();
	}

	public Mario getMario() {
		return mario;
	}

	public void moverse() {
		this.getInteligencia().mover(this);
	}

	public void modificarMario(Mario m) {

	}

	@Override
	public Sprite getSprite() {
		return getSpriteMovements().getSprite(0);
	}

	public PowerUp clone() {
		return null;
	}

	/*
	 * CARACTERISTICAS: Estas caracteristicas se aplican a mario cuando el powerup esta acoplado a
	 * mario bros.
	 */
	public abstract void aumentarPuntos();

	public void golpear(Celda c) {
		c.golpear(mario);
	}

	public abstract void hacerAccion();

	public abstract void disparar();

	public void hacerMarioGrande(SpriteMovementsPrioridad ani) {
		mario.setSizeY(Constantes.sizeMarioGrandeY);
		mario.setSizeX(Constantes.sizeMarioGrandeX);
		mario.setY(mario.getY() - (Constantes.sizeMarioGrandeY - Constantes.sizeMarioChicoY));
		Celda c = mario.getInteligencia().getControlColisiones().getColisionCelda(mario, Constantes.dir_nada_right);
		if (c != null)
			mario.setY(c.getY() - c.getSizeY() + 1);

		(ani).setRetardoPrioridad(12);
		(ani).setPrioridad(8, false);
		mario.setAniActual(ani);
	}

	public void hacerMarioChico(SpriteMovements ani) {
		mario.setSizeY(Constantes.sizeMarioChicoY);
		mario.setSizeX(Constantes.sizeMarioChicoX);
		mario.setY(mario.getY() + (Constantes.sizeMarioGrandeY - Constantes.sizeMarioChicoY));
		mario.setAniActual(ani);

		PUVacio p = new PUVacio(0, 0, null, null);
		p.setInteligencia(intel);
		quitarCaracteristica();
		quitarCaracteristica();

	}

	public abstract void hacerInvulnerable();

	public abstract void aumentarVidas();

	public abstract void matarEnemigosVisibles();

	public abstract void morirMario();

	public void colisionarEnemigo(Enemigo e) {
		if (!mario.isDead()){
			if (!e.mataAMario()){
				if (mario.isCayendo() && mario.getY()<e.getY()) {
					mario.reSaltar();
					if (!mario.isEstrella())
						mario.hacerInvulnerable(100, false);
					mario.matarEnemigo(e);
				} else {
					if (!mario.isInvulnerable()) {
						mario.aumentarPuntos(e.getPuntosPorMuerte());
						morirMario();
					} else {
						if (mario.isEstrella())
							mario.matarEnemigo(e);
					}
				}
			}
			else{
				mario.aumentarPuntos(e.getPuntosPorMuerte());
				morirMario();
			}
		}
		
		

	}

	public void quitarCaracteristica() {
		mario.setCaracteristica(mario.getCaracteristicaAuxiliar());
		PUVacio p = new PUVacio(0, 0, null, null);
		p.setInteligencia(intel);
		p.aplicarMario(this.mario);
		mario.setCaracteristicaAuxiliar(p);
	}

}
